// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraActivatableWidget.h"

#include "Editor/WidgetCompilerLog.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraActivatableWidget)

#define LOCTEXT_NAMESPACE "Lyra"

/**
 * 构造函数
 * @param ObjectInitializer 对象初始化器
 */
ULyraActivatableWidget::ULyraActivatableWidget(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer) // 调用父类构造函数
{
}

/**
 * 获取此控件激活时所需的输入配置
 * 根据 InputConfig 枚举值返回相应的 FUIInputConfig
 * @return 可选的输入配置，如果不指定则返回空
 */
TOptional<FUIInputConfig> ULyraActivatableWidget::GetDesiredInputConfig() const
{
	switch (InputConfig) // 根据输入配置枚举进行切换
	{
	case ELyraWidgetInputMode::GameAndMenu: // 游戏和菜单模式
		return FUIInputConfig(ECommonInputMode::All, GameMouseCaptureMode); // 返回所有输入模式，使用游戏鼠标捕获模式
	case ELyraWidgetInputMode::Game: // 仅游戏模式
		return FUIInputConfig(ECommonInputMode::Game, GameMouseCaptureMode); // 返回游戏输入模式，使用游戏鼠标捕获模式
	case ELyraWidgetInputMode::Menu: // 仅菜单模式
		return FUIInputConfig(ECommonInputMode::Menu, EMouseCaptureMode::NoCapture); // 返回菜单输入模式，不使用鼠标捕获
	case ELyraWidgetInputMode::Default: // 默认模式
	default: // 默认情况
		return TOptional<FUIInputConfig>(); // 返回空的可选值
	}
}

#if WITH_EDITOR // 仅在编辑器环境下编译

/**
 * 验证编译的控件树
 * 检查是否实现了 BP_GetDesiredFocusTarget 函数，如果没有则记录警告或注释
 * @param BlueprintWidgetTree 蓝图控件树
 * @param CompileLog 编译日志接口
 */
void ULyraActivatableWidget::ValidateCompiledWidgetTree(const UWidgetTree& BlueprintWidgetTree, class IWidgetCompilerLog& CompileLog) const
{
	Super::ValidateCompiledWidgetTree(BlueprintWidgetTree, CompileLog); // 调用父类的验证方法

	if (!GetClass()->IsFunctionImplementedInScript(GET_FUNCTION_NAME_CHECKED(ULyraActivatableWidget, BP_GetDesiredFocusTarget))) // 检查是否在脚本中实现了 BP_GetDesiredFocusTarget 函数
	{
		if (GetParentNativeClass(GetClass()) == ULyraActivatableWidget::StaticClass()) // 如果父类是原生 ULyraActivatableWidget
		{
			CompileLog.Warning(LOCTEXT("ValidateGetDesiredFocusTarget_Warning", "GetDesiredFocusTarget wasn't implemented, you're going to have trouble using gamepads on this screen.")); // 记录警告日志
		}
		else // 如果父类不是原生 ULyraActivatableWidget
		{
			//TODO - 暂时记录注释，因为我们不能保证它没有在原生基类中实现
			CompileLog.Note(LOCTEXT("ValidateGetDesiredFocusTarget_Note", "GetDesiredFocusTarget wasn't implemented, you're going to have trouble using gamepads on this screen.  If it was implemented in the native base class you can ignore this message.")); // 记录注释日志
		}
	}
}

#endif // WITH_EDITOR 结束

#undef LOCTEXT_NAMESPACE // 取消定义本地化文本命名空间